﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using SevenZip;

namespace Cataloger
{
    /// <summary>
    /// Docelowo zastapi 2 klasy: PlikArchiwumZip i PlikArchiwumRar
    /// </summary>
    [Serializable]
    public class PlikArchiwum : Plik
    {
		#region Fields (1) 

        /// <summary>
        /// Lista plików i folderów znajdujących się w archiwum
        /// </summary>
        List<ArchiwumEntry> entries = new List<ArchiwumEntry>();

		#endregion Fields 

		#region Constructors (1) 

        public PlikArchiwum(FileInfo fi)
            : base(fi)
        {
            SevenZip.SevenZipExtractor Archiwum = new SevenZipExtractor(fi.FullName);

            foreach (ArchiveFileInfo item in Archiwum.ArchiveFileData)
            {
                Entries.Add(new ArchiwumEntry(item.FileName, item.LastWriteTime, (long)item.Size, item.IsDirectory, this));
            }

            this.Opis += "Plik Archiwum\nLiczba plików:\t\t" + this.IlePlikow+
                         "\nLiczba folderów:\t"+this.IleFolderow;
        }

		#endregion Constructors 

		#region Properties (6) 

        public List<ArchiwumEntry> Entries
        {
            get { return entries; }
        }

        public long IleFolderow
        {
            get
            {
                long licz = 0;
                foreach (ArchiwumEntry ent in entries)
                {
                    if (ent.CzyFolder)
                    {
                        licz++;
                    }
                }
                return licz;
            }
        }

        public long IlePlikow
        {
            get
            {
                long licz = 0;
                foreach (ArchiwumEntry ent in entries)
                {
                    if (!ent.CzyFolder)
                    {
                        licz++;
                    }
                }
                return licz;
            }
        }

        public string KrotkiOpis
        {
            get
            {
                return string.Format("{0} ({1}), Data: {3}, Rozmiar: {2} (Plików: {4} Folderów: {5})",
                    this.Nazwa, this.Typ, this.Rozmiar.ToProperUnit(), this.DataUtw.ToShortDateString(), this.IlePlikow.ToString("N0"),
                    this.IleFolderow.ToString("N0"));
            }
        }

        public override string OpisWlasciwosci
        {
            get
            {
                StringBuilder st = new StringBuilder();
                st.AppendLine("Nazwa: \t" + this.Nazwa);
                st.AppendLine("Sciezka: \t" + this.Sciezka);
                try
                {
                    st.AppendLine("Kategoria: \t" + this.Kategoria.Nazwa);
                }
                catch { }
                st.AppendLine("Rozmiar: \t" + this.rozmiar.ToProperUnit());
                st.AppendLine("Data utw: \t" + this.dataUtw.ToShortDateString() + "  " + this.dataUtw.ToShortTimeString());
                st.AppendLine("Data mod: \t" + this.dataMod.ToShortDateString() + "  " + this.dataMod.ToShortTimeString());
                st.AppendLine("Data dos: \t" + this.dataDost.ToShortDateString() + "  " + this.dataDost.ToShortTimeString());
                st.AppendLine("Atrybuty: \t" + this.atrybuty.ToString());
                st.AppendLine("Nosnik: \t" + this.Nosnik.Nazwa);
                st.AppendLine("Katalog: \t" + this.KataloG.Nazwa);
                st.AppendLine("Ilosc plikow: \t" + this.entries.Count);


                return st.ToString();
            }
        }

        public List<ArchiwumEntry> Pliki
        {
            get
            {
                List<ArchiwumEntry> temp = new List<ArchiwumEntry>();
                foreach (ArchiwumEntry aE in entries)
                {
                    if (!aE.CzyFolder)
                    {
                        temp.Add(aE);
                    }
                }
                return temp;
            }
        }

		#endregion Properties 

    }
}